from C_Header_Parse.Struct_Class_Define import headfile,struct,array,member,define
from C_Header_Parse.Format_Lib import String_Handle
import os,sys,re

def Header_FileParse(HeadFile_Path):
    # 获取当前工作路径
    #def C_Headeer_Parse_Func(File_Name):
    # current_path = os.path.abspath(os.path.dirname(sys.argv[0]))

    # HeadFile_Path = current_path + './Radar410_data.h'

    HeadFile = headfile(HeadFile_Path)
    #只读，以'ISO-8859-1'编码方式打开
    file = open(HeadFile_Path,"r",encoding='ISO-8859-1')
    Delete_Char_List = ['\t','\n',' ',';']
    while 1:
        Line = file.readline()
        if not Line: # read over exit while breakpoint this you can see all class dbc 
            break

        #HeadFile.Find_Struct_Head_Tail(Line)
    # 解析结构体
        # 查找 结构体的 头和尾
        if 'typedef struct' in Line:
            HeadFile.Find_Strut_Flag = True
            HeadFile.Last_Strut_Flag = True
            HeadFile.Struct['Struct'] = struct()
            # strip:删除字符 split：根据字符将字符串分割为list
            HeadFile.Struct['Struct'].Tag = Line.strip('typedef struct').strip('\n').split(' ')
        if '}' in Line and ';' in Line:
            HeadFile.Find_Strut_Flag = False

        # 根据头和尾 中间的内容来 解析。填充 struct 类
        if True == HeadFile.Find_Strut_Flag:
            if ';' in Line and '}' not in Line:
                # 在这里做具体的结构体成员解析：
                if '[' not in Line:
                    line_temp = String_Handle(Line,Delete_Char_List)
                    # todo：这里可能需要做基础类型和结构体的区分
                    line_temp[1] = line_temp[1].split(';')[0]
                    HeadFile.Struct['Struct'].Member[line_temp[1]] = member(line_temp[0],line_temp[1])
                    print(HeadFile.Struct['Struct'].Member[line_temp[1]].Name + HeadFile.Struct['Struct'].Member[line_temp[1]].Type)
                else:
                    line_temp = Line.strip('\t').strip(' ').strip(';\n').split(' ')
                    # 删除列表中为 ' '的元素  todo 回头记录到python的笔记里面。
                    line_temp = [item for item in line_temp if item != '']
                    # 防止某些数组使用宏定义作为数组的下标
                    found = False
                    for define_ in  HeadFile.Define:
                        # if '    RADAR_410_OBJ_TYPE obj_interface[RADAR_410_OBJ_MAX_NUM];' in Line:
                        #     a = 1
                        if HeadFile.Define[define_].Macro == line_temp[1].split('[')[1][:-1]:
                            # 发现数组下标为宏定义使用宏定义的内容
                            found = True
                            # 据指定的分隔符 '[]' 来分割字符串
                            HeadFile.Struct['Struct'].Member_Array[line_temp[1]] = array(line_temp[0],\
                        line_temp[1].split('[')[0],HeadFile.Define[define_].Value)
                    if False == found:
                        # 据指定的分隔符 '[]' 来分割字符串
                        match = re.search(r'\[(.*?)\]', line_temp[1])
                        extracted = match.group(1)
                        HeadFile.Struct['Struct'].Member_Array[line_temp[1]] = array(line_temp[0],\
                            line_temp[1].split('[')[0],extracted)
        # 找到结构体的头，之后又找到了尾,给结构体重新命名
        if False == HeadFile.Find_Strut_Flag and True == HeadFile.Last_Strut_Flag:
            HeadFile.Last_Strut_Flag = False
            # eg： }RADAR_410_INTERFACE; → RADAR_410_INTERFACE
            # 这里这样写的话，对结构体的type写法必须要注意了
            line_temp = Line.split('}')[1].split(";")[0]
            # pop方法会返回并删除键'Struct'及其对应的值
            value = HeadFile.Struct.pop('Struct')
            # 添加新的键值对，键为'line_temp'，值为原先'Struct'的值，方便后续的调试和二次开发xml文件
            # 这样操作是因为键无法直接更改值，而结构体的type名会在最后才被定义
            HeadFile.Struct[line_temp] = value

    # 添加功能
    # 解析#define
        # 防止某些数组使用宏定义作为数组的下标
        if '#define' in Line:
            line_temp = Line.strip('\n').split(' ')
            line_temp = [item for item in line_temp if item != '']
            try:
                HeadFile.Define[line_temp[1]] = define(line_temp[1],line_temp[2])
            except:
                pass



    # 解析枚举 todo

    # 返回解析出的类
    return HeadFile